// system.go
package main

import (
	"crypto/sha256"

	"github.com/Nik-U/pbc"
)

// System 包含公共参数和全局设置
type System struct {
	PublicPar *BilinearGroup
	BlockSize int // 将块大小移到这里，作为系统级参数
}

// BilinearGroup 存储双线性对相关参数
type BilinearGroup struct {
	Pairing *pbc.Pairing
	G       *pbc.Element
	H       *pbc.Element
}

// NewSystem 创建一个新的系统实例
func NewSystem(blockSize int) *System {
	return &System{
		PublicPar: NewBilinearGroup(),
		BlockSize: blockSize,
	}
}

// NewBilinearGroup 初始化密码学参数
func NewBilinearGroup() *BilinearGroup {
	params := pbc.GenerateA(160, 512)
	pairing := params.NewPairing()
	g := pairing.NewG1().Rand()
	h := pairing.NewG1().Rand()
	return &BilinearGroup{
		Pairing: pairing,
		G:       g,
		H:       h,
	}
}

// F 是伪随机函数 F: {0,1}* -> Z_p
func F(input []byte, pairing *pbc.Pairing) *pbc.Element {
	hash := sha256.Sum256(input)
	// 将哈希结果直接转换为 Zr 元素
	return pairing.NewZr().SetFromHash(hash[:])
}
